package com.yhh.college_information_platform.service;

import com.yhh.college_information_platform.common.PageResult;
import com.yhh.college_information_platform.dto.NotificationQueryDTO;
import com.yhh.college_information_platform.vo.NotificationVO;

/**
 * 消息通知服务接口
 */
public interface NotificationService {
    
    /**
     * 发送评论通知
     * @param resourceId 资源ID
     * @param resourceTitle 资源标题
     * @param receiverId 接收者ID（资料上传者）
     * @param senderId 发送者ID（评论者）
     * @param senderName 发送者昵称
     * @param commentContent 评论内容
     */
    void sendCommentNotification(Long resourceId, String resourceTitle, Long receiverId, 
                                 Long senderId, String senderName, String commentContent);
    
    /**
     * 发送回复通知
     * @param resourceId 资源ID
     * @param resourceTitle 资源标题
     * @param commentId 评论ID
     * @param receiverId 接收者ID（被回复的评论者）
     * @param senderId 发送者ID（回复者）
     * @param senderName 发送者昵称
     * @param replyContent 回复内容
     */
    void sendReplyNotification(Long resourceId, String resourceTitle, Long commentId,
                               Long receiverId, Long senderId, String senderName, String replyContent);
    
    /**
     * 发送审核通知
     * @param resourceId 资源ID
     * @param resourceTitle 资源标题
     * @param receiverId 接收者ID（资料上传者）
     * @param isApproved 是否通过
     * @param rejectReason 拒绝理由（审核通过时为空）
     */
    void sendAuditNotification(Long resourceId, String resourceTitle, Long receiverId, 
                              Boolean isApproved, String rejectReason);
    
    /**
     * 发送系统通知
     * @param receiverId 接收者ID（null表示全员通知）
     * @param title 通知标题
     * @param content 通知内容
     */
    void sendSystemNotification(Long receiverId, String title, String content);
    
    /**
     * 获取通知列表
     * @param userId 用户ID
     * @param queryDTO 查询条件
     * @return 通知列表
     */
    PageResult<NotificationVO> getNotificationList(Long userId, NotificationQueryDTO queryDTO);
    
    /**
     * 获取未读消息数量
     * @param userId 用户ID
     * @return 未读消息数量
     */
    Long getUnreadCount(Long userId);
    
    /**
     * 标记单条通知为已读
     * @param notificationId 通知ID
     * @param userId 用户ID
     */
    void markAsRead(Long notificationId, Long userId);
    
    /**
     * 标记全部通知为已读
     * @param userId 用户ID
     */
    void markAllAsRead(Long userId);
    
    /**
     * 删除通知
     * @param notificationId 通知ID
     * @param userId 用户ID
     */
    void deleteNotification(Long notificationId, Long userId);
    
    /**
     * 清空已读通知
     * @param userId 用户ID
     */
    void clearReadNotifications(Long userId);
}

